環境変数NODE_EXTRA_CA_CERTSがコールドスタートに与える影響を確認してみた
環境変数NODE_EXTRA_CA_CERTSがコールドスタートに与える影響を確認してみた
CX事業本部@大阪の岩田です。
昨年11月にLambdaのランタイムでNode.js 20がサポートされるようになりました。
Node.js 18のランタイムと比較して色々な点が更新されているのですが、変更点の1つとしてRoot CA証明書の読み込みに関する挙動の変更が挙げられます。詳細については上記のAWSブログに記載されていますが、内容を要約すると以下の通りです。
- Node.js 18までのランタイムはNode.jsが標準で読み込むRoot CA証明書に加えて、各種AWSサービスに接続するために必要なAmazonのRoot CA証明書を読み込んでいる
- これらの証明書の読み込みはコールドスタートのパフォーマンス劣化につながるため、Node.js 20のランタイムでは追加のRoot CA証明書を読み込まないようになった
- Node.js 20のランタイムでは
/var/runtime/ca-cert.pem
に全てのAmazonのRoot CA証明書を含むファイルが配置されている - Node.js 20のランタイムではLambdaの環境変数
NODE_EXTRA_CA_CERTS
に上記/var/runtime/ca-cert.pem
を指定することでAmazon のRoot CA証明書が追加で読み込まれ、Node.js 18までと同じ振る舞いになる /var/runtime/ca-cert.pem
の読み込みは時間がかかるので、AmazonのRoot CA証明書を読み込む必要があるユースケースでは、必要な証明書のみをLambdaのデプロイパッケージに含めるようにし、環境変数NODE_EXTRA_CA_CERTS
から参照するのが好ましい
実際にNODE_EXTRA_CA_CERTS
の指定が、どの程度コールドスタートに影響を及ぼすのかを検証してみました。
環境
今回検証に利用した環境です
- メモリ割当: 128M
- CPUアーキテクチャ: arm64
- ランタイム: nodejs:20.v14
- ランタイムバージョンARN: arn:aws:lambda:ap-northeast-1::runtime:d4c968f0a85420c036d732975b0317307799fc7152619b3c4fb289f5d8e34f8a
検証手順
計測対象のLambdaのコードは以下の通りです。デフォルトのコードにsetTimeoutを利用した5秒の疑似Sleep処理を追加し、同時にLambdaが呼び出された場合にコールドスタートが発生しやすいように調整しています。
export const handler = async (event) => { await new Promise(resolve => setTimeout(resolve, 5000)) const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
上記のコードに加え、LambdaのデプロイパッケージにRDS用のRoot CA証明書を含めるようにします。
続いて以下のコードを実行し、上記のLambdaを連続で非同期呼び出しします。
import boto3 client = boto3.client('lambda') for i in range(100): client.invoke_async(FunctionName='NodeExtraCaCerts',InvokeArgs="{}")
実行完了後、CloudWatch Logs Insightsから以下のクエリを実行し、コールドスタート関連の集計値を取得します。
filter @type = "REPORT" | parse @message /Init Duration: (?<init>\S+)/ | stats count(init) as count, min(init) as min,max(init) as max, avg(init) as avg, median(init) as median, pct(init, 95) as tile
計測結果
結果は以下の通りでした
環境変数NODE_EXTRA_CA_CERTS | コールドスタート発生件数 | 最小値 | 最大値 | 平均 | 中央値 | 95%タイル |
---|---|---|---|---|---|---|
設定無し | 91 | 128.56 | 201.57 | 139.8471 | 137.37 | 168.3 |
/var/task/ap-northeast-1-bundle.pem | 96 | 141.45 | 216.89 | 155.3957 | 153.45 | 170.87 |
/var/runtime/ca-cert.pem | 94 | 156.23 | 220.24 | 171.9132 | 171.59 | 181.15 |
追加のCA証明書を一切読み込まないNode.js 20のランタイム標準のパターンが一番高速で、すべての Amazon CA 証明書を読み込むパターンが一番遅いという結果でした。AWSブログの解説通りで予想通りの結果となっています。
まとめ
Node.js 20のランタイムにおいて環境変数NODE_EXTRA_CA_CERTS
がコールドスタートに与える影響を確認してみました。AWSブログで解説されている通り、追加のCA証明書の読み込みが必要な場合は、必要最低限の証明書のみデプロイパッケージに含めるようにするのが良いでしょう。
また、Node.js 18以前のランタイムを利用している環境では、Node.js 20のランタイムに移行することでRoot CA証明書の読み込みに必要な処理時間が改善され、コールドスタートの高速化が期待できます。※CA証明書読み込み以外の最適化の恩恵も受けられるはずです。まだ移行できていない場合はランタイムのバージョンアップを検討してみてはいかがでしょうか?